package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.exception.InsertionNotAllowedException;
import com.sky.exception.UpdateNotAllowedException;
import com.sky.mapper.CategoryMapper;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.result.PageResult;
import com.sky.service.CategoryService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {

	@Autowired
	private CategoryMapper categoryMapper;
	@Autowired
	private DishMapper dishMapper;
	@Autowired
	private SetmealMapper setmealMapper;

	/**
	 * 新增菜品和套餐分类
	 *
	 * @param categoryDTO
	 */
	@Override
	public void save(CategoryDTO categoryDTO) {

		// 如果分类名已存在则抛出异常
		if (categoryMapper.getByName(categoryDTO.getName()) != null) {
			throw new InsertionNotAllowedException(MessageConstant.CATEGORY_ALREADY_EXISTS);
		}

		// 业务类属性拷贝成实体类
		Category category = new Category();
		BeanUtils.copyProperties(categoryDTO, category);
		//分类状态默认为禁用状态0
		category.setStatus(StatusConstant.DISABLE);

		categoryMapper.insert(category);
	}

	/**
	 * 分类分页查询
	 *
	 * @param categoryPageQueryDTO
	 * @return
	 */
	@Override
	public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) {
		// 开始分页查询，下一条sql进行分页，自动加入limit关键字分页
		PageHelper.startPage(categoryPageQueryDTO.getPage(), categoryPageQueryDTO.getPageSize());

		Page<Category> page = categoryMapper.pageQuery(categoryPageQueryDTO);

		return new PageResult(page.getTotal() ,page.getResult());
	}

	/**
	 * 根据id删除该分类
	 *
	 * @param id
	 */
	@Override
	public void deleteById(Long id) {

		//查询当前分类是否关联了菜品，如果关联了就抛出业务异常
		Integer count = dishMapper.countByCategoryId(id);
		if (count > 0) {
			//当前分类下有菜品，不能删除
			throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH);
		}
		//查询当前分类是否关联了套餐，如果关联了就抛出业务异常
		count = setmealMapper.countByCategoryId(id);
		if (count > 0) {
			//当前分类下有套餐，不能删除
			throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL);
		}
		//删除改分类
		categoryMapper.deleteById(id);
	}

	/**
	 * 修改分类
	 *
	 * @param categoryDTO
	 */
	@Override
	public void update(CategoryDTO categoryDTO) {
		//如果修改了分类名
		if (!categoryMapper.getById(categoryDTO.getId()).getName().equals(categoryDTO.getName())) {
			// 如果分类名已存在则抛出异常
			if (categoryMapper.getByName(categoryDTO.getName()) != null) {
				throw new UpdateNotAllowedException(MessageConstant.CATEGORY_ALREADY_EXISTS);
			}
		}
		// 业务类属性拷贝成实体类
		Category category = new Category();
		BeanUtils.copyProperties(categoryDTO, category);

		categoryMapper.update(category);
	}

	/**
	 * 启用禁用分类
	 *
	 * @param status
	 * @param id
	 */
	@Override
	public void startOrStop(Integer status, Long id) {
		Category category = Category.builder().id(id)
				.status(status)
				.build();
		categoryMapper.update(category);
	}

	/**
	 * 根据类型查询分类
	 *
	 * @param type
	 * @return
	 */
	@Override
	public List<Category> list(Integer type) {
		return categoryMapper.list(type);
	}
}
